package main

import (
	"fmt"
	"math"
	"sort"
)

type graphics struct {
	lang, wide, areas float32
}

type sortSlice []graphics

func (a sortSlice) Len() int      { return len(a) }
func (a sortSlice) Swap(i, j int) { a[i], a[j] = a[j], a[i] }

func (a sortSlice) Less(i, j int) bool { return a[i].areas < a[j].areas }

func (g *graphics) area(fn func(float32, float32) float32) float32 { return fn(g.lang, g.wide) }

func main() {

	rectangles := graphics{lang: 10, wide: 5} //长方形
	triangles := graphics{lang: 10, wide: 5}  //三角形
	circle := graphics{lang: 10, wide: 10}    //圆形

	rectangles.areas = rectangles.area(func(a, b float32) float32 { return a * b })

	triangles.areas = triangles.area(func(a, b float32) float32 { return a * b / 2 })

	circle.areas = circle.area(func(a, b float32) float32 { return math.Pi * a * b })

	// var Area4 getArea = &rectangles
	sortArea := []graphics{rectangles, triangles, circle}

	sort.Sort(sortSlice(sortArea))
	fmt.Printf("%+v\n", sortArea) //升序
	sort.Sort(sort.Reverse(sortSlice(sortArea)))
	fmt.Printf("%+v\n", sortArea) //降序
}

// 阿飞老师的批改
// 1. 三角形、长方形和原型没有相同的特征，尽量使用不同的结构体来定义
// 2. 求面积时注意特殊参数的处理，以及参数类型的处理。长宽、高、半径等不应该是int类型;
// 3. 剩下几题也尝试自己完成
